package model.collisions;

import java.util.Collection;

import model.collisions.effects.CollisionEffect;
import model.exceptions.ModelExceptions;

/**
 * La clase Collision Engine.
 * Es la clase encargada de manejar la colisiones del modelo de forma unificada.
 * La clase usa un diccionario de efectos de los cuales obtiene una lista de effectos que se aplican de forma iterativa.
 * Se manejan las colisiones cruzadas en una sola llamada, por lo que el diccionario solo debe contener los effectos 
 * que se deben aplicar de A hacia B, cuando B colisiona con A
 */
public abstract class CollisionEngine {
	
	/**
	 * Busca y aplica la lista de efectos de una unica colision.
	 *
	 * @param collisioner el elemento que colisiona
	 * @param collisionee el elemento contra el que colisiono
	 * @throws ModelExceptions the model exceptions
	 */
	private static void solveSimpleCollision( Collisionable collisioner, Collisionable collisionee ) throws ModelExceptions
	{
	    Collection<CollisionEffect> effects = CollisionDictionary.getEffectsFor( collisioner, collisionee );
		
		for(CollisionEffect effect : effects)
			effect.applyFromTo( collisionee, collisioner );

	}
	
	/**
	 * Busca para cada uno de los objetos colisionados, una lista de efectos que se deben aplicar contra el colisionador y
	 * se los aplica a este. Tambien aplica cualquier efecto del colisionador hacia los colisionados.
	 *
	 * @param collisioner el elemento que colisiona
	 * @param collisionees una lista de elementos contra los que se colisiono
	 * @throws ModelExceptions the model exceptions
	 */
	public static void solve( Collisionable collisioner, Collection<Collisionable> collisionees ) throws ModelExceptions
	{		
		for( Collisionable collisionee : collisionees ) {
			if( collisioner != collisionee ) { 	
				solveSimpleCollision( collisioner, collisionee );
				solveSimpleCollision( collisionee, collisioner );
			}
		}
	}

}
